package com.xbongbong.pro.statistic.enums;

import com.xbongbong.pro.enums.IntervalTypeEnum;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * 常用类型枚举
 * @author xinpeng.jiang
 * @date 2021/10/13 10:38
 * @version 1.0
 * @since V1.0
 */
@Getter
public enum NormalTypeEnum {
    // 日，1-10
    /**
     * 昨天
     */
    YESTERDAY(1),
    /**
     * 今天
     */
    TODAY(2),
    /**
     * 明天
     */
    TOMORROW(3),
    /**
     * 今日之后
     */
    AFTER_TODAY(4),
    
    // 周，11-20
    /**
     * 上周
     */
    LAST_WEEK(11),
    /**
     * 本周
     */
    THIS_WEEK(12),
    /**
     * 下周
     */
    NEXT_WEEK(13),
    
    // 月，21-30
    /**
     * 上月
     */
    LAST_MONTH(21),
    /**
     * 本月
     */
    THIS_MONTH(22),
    /**
     * 下月
     */
    NEXT_MONTH(23),

    // 季度，31-40
    /**
     * 上季度
     */
    LAST_QUARTER(31),
    /**
     * 本季度
     */
    THIS_QUARTER(32),
    /**
     * 下季度
     */
    NEXT_QUARTER(33),
    
    // 年，41-50
    /**
     * 上年
     */
    LAST_YEAR(41),
    /**
     * 本年
     */
    THIS_YEAR(42),
    /**
     * 下年
     */
    NEXT_YEAR(43),
    
    /**
     * 防错
     */
    UNKNOWN(-1)
    ;

    /**
     * 指标类型code值
     */
    private final int code;

    NormalTypeEnum(int code) {
        this.code = code;
    }

    /**
     * 通过枚举<code>code</code>获得枚举
     *
     * @param code
     * @return IndexTypeEnum
     */
    public static NormalTypeEnum getByCode(Integer code) {
        for (NormalTypeEnum cacheCode : values()) {
            if (Objects.equals(cacheCode.getCode(), code)) {
                return cacheCode;
            }
        }
        return UNKNOWN;
    }

    /**
     * 根据时间格式获取符合的常用类型枚举 --- 只是适用于副指标图的动态筛选操作
     *
     * @param format 格式化信息
     * @return 枚举类型 List<NormalTypeEnum>
     */
    public static List<NormalTypeEnum> getByFormatStr(String format) {
        List<NormalTypeEnum> list = new ArrayList<>();
        IntervalTypeEnum intervalTypeEnum = IntervalTypeEnum.getByFormatStr(format);
        switch (intervalTypeEnum){
            case YEAR:
                list.add(LAST_YEAR);
                list.add(THIS_YEAR);
                list.add(NEXT_YEAR);
                break;
            case YEAR_QUARTER:
                list.add(LAST_QUARTER);
                list.add(THIS_QUARTER);
                list.add(NEXT_QUARTER);
                break;
            case YEAR_MONTH:
                list.add(LAST_MONTH);
                list.add(THIS_MONTH);
                list.add(NEXT_MONTH);
                break;
            case YEAR_WEEK:
                list.add(LAST_WEEK);
                list.add(THIS_WEEK);
                list.add(NEXT_WEEK);
                break;
            case YEAR_MONTH_DAY:
                list.add(YESTERDAY);
                list.add(TODAY);
                list.add(TOMORROW);
                break;
            default:
                break;
        }
        return list;
    }

}
